/*! @File        : tcpcommunicate.h
 *  @Brief       : TCP接口
 *  @Details     : 详细说明
 *  @Author      : 毛辰飞
 *  @Date        : 2024-11-18 09:48:46
 *  @Version     : v1.0
 *  @Copyright   : Copyright By 毛辰飞, All Rights Reserved
 *
 **********************************************************
 *
 *  @Attention   :
 *  @par 修改日志:
 *  <table>
 *  <tr><th>Date       <th>Version   <th>Author    <th>Description
 *  <tr><td>2024-11-18 <td>1.0       <td>毛辰飞     <td>创建初始版本
 *  </table>
 *
 *********************************************************
 */
#ifndef TCPCOMMUNICATE_H
#define TCPCOMMUNICATE_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QJsonObject>
//客户端
class MyTcpClient : public QObject
{
    Q_OBJECT
public:
    explicit MyTcpClient(int iClientPort,QObject *parent = nullptr);
private:
    QTcpSocket *m_pTcpClient;
private slots:
    void slot_writeData(QByteArray  &ba);

signals:
};
//服务端
class MyTcpServer : public QObject
{
    Q_OBJECT
public:
    explicit MyTcpServer(int iServerPort,QObject *parent = nullptr);
private:
    //定义服务器指针
    QTcpServer *m_pTcpServer;
    //定义客户端指针链表容器
    QList<QTcpSocket *> pClientList;
    enum MannualStateEnum{MANNUAL_BODY_JOINTS=0,MANNUAL_ENDEFFCTOR_JOINTS=1,MANNUAL_OTHER_JOINTS=-1};
    MannualStateEnum m_eMannualJoints=MANNUAL_OTHER_JOINTS;
private:
    void _handle(const QByteArray &src);

    void _handleRequestControl(const bool bCommand);//请求控制机器人
    void _handleRequestPower(const bool bCommand);//查询机器人开机状态
    void _handleCommandPoweroff(const bool bCommand);//上位机发送的关机指令

    //命令机器人更改控制状态——手动command_robotstate_manual
    //自动command_robotstate_auto
    //示教command_robotstate_demonstrate
    //遥操作command_robotstate_teleoperation
    void _handleCommandChangeRobotState(const QString &sValue);//上位机通过tcp发送过来的控制模式更改

    void _handleGait(const bool bCommand);//上位机通过tcp发送过来的请求获取当前步态的信息
    void _handleGaitCommand(const QString &sValue);//上位机通过tcp发送过来的更改当前的步态的指令
    void _handleCalibration(const QString &sValue);//上位机通过tcp发送过来的标定指令

    void _handleEndeffctorInfo();//上位机通过tcp发送过来的末端执行器的指令信息
    void _handleEmergency(const QString &sValue);//上位机通过tcp发送过来的一级指令——暂停/启动/停止

    void _handleCommandRootStateMannual(const QJsonObject &obj,const MannualStateEnum &state);//上位机通过tcp发送过来的手动模式下更改机器人关节或者末端指令
    void _handleCommandRootStateAuto(const QJsonObject &obj);//上位机通过tcp发送过来的自动模式下位置控制或者固定动作指令


private slots:
    void slot_onNewConnection();


signals:
};

#endif // TCPCOMMUNICATE_H
